import { ArgumentMetadata, Injectable, PipeTransform } from '@nestjs/common';
import { plainToInstance } from 'class-transformer';
import { validate } from 'class-validator';

@Injectable()
export class ValidatePipe implements PipeTransform {
  async transform(value: any, metadata: ArgumentMetadata) {
    // value 就是前端传入的值，@body，
    // metadata { metatype: [class CreateUserDto], type: 'body', data: undefined }
    // 如若前端改成 @Body('name', ValidatePipe) ，那么 metadata 就是 { metatype: [class CreatePipeValidateDto], type: 'body', data: 'name' }
    // console.log(value, metadata);
    const dto = plainToInstance(metadata.metatype, value);
    const errors = await validate(dto);
    if (errors.length) {
      const msg = errors.map((err) => Object.values(err.constraints));
      value.resCode = '0';
      value.validateMsg = msg;
    }
    return value;
  }
}
